package com.test;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 2 * @Author: madonghui
 * 3 * @Date: 2020/10/29 15:32
 * 4
 * cas compareAndSwap
 */
public class CASDemo {
    public static void main(String[] args) {
        /**
         * 主线程的值是5，拷贝到自己的线程的值也是5
         */
        AtomicInteger atomicInteger = new AtomicInteger(5);
        /**
         * 第一个参数是期望值，第二个参数是更新值主物理内存的值进行比较，相等，则进行修改
         *
         * 工作过程：用初始值（我手上的值）和
         */
        boolean b = atomicInteger.compareAndSet(5, 2019);
        System.out.println("b = " + b+"\t"+"current data:"+atomicInteger);
        /**
         * 此处主内存的值已经发生了修改，无法完成修改；当前线程会重新从主物理内存复制一份值到自己的物理内存
         */
        boolean b1 = atomicInteger.compareAndSet(5, 2020);
        System.out.println("b1 = " + b1+"\t"+"current data:"+atomicInteger);
        /**
         * 知识回顾：此处的操作类似 git提交每次提交都会有版本号，版本号就是需要被比较并且被刷新的值
         */
        /**
         * 相当于i++
         */
        atomicInteger.getAndIncrement();
    }
}
